home *** CD-ROM | disk | FTP | other *** search
/ LG Super CD / LG Super CD.iso / bitpim / bitpim-0.62-setup.exe / {app} / bitpim.exe / popen2.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2003-11-06  |  6.3 KB  |  208 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.3)
  3.  
  4. import os
  5. import sys
  6. __all__ = [
  7.     'popen2',
  8.     'popen3',
  9.     'popen4']
  10. MAXFD = 256
  11. _active = []
  12.  
  13. def _cleanup():
  14.     for inst in _active[:]:
  15.         inst.poll()
  16.     
  17.  
  18.  
  19. class Popen3:
  20.     sts = -1
  21.     
  22.     def __init__(self, cmd, capturestderr = False, bufsize = -1):
  23.         _cleanup()
  24.         (p2cread, p2cwrite) = os.pipe()
  25.         (c2pread, c2pwrite) = os.pipe()
  26.         if capturestderr:
  27.             (errout, errin) = os.pipe()
  28.         
  29.         self.pid = os.fork()
  30.         if self.pid == 0:
  31.             os.dup2(p2cread, 0)
  32.             os.dup2(c2pwrite, 1)
  33.             if capturestderr:
  34.                 os.dup2(errin, 2)
  35.             
  36.             self._run_child(cmd)
  37.         
  38.         os.close(p2cread)
  39.         self.tochild = os.fdopen(p2cwrite, 'w', bufsize)
  40.         os.close(c2pwrite)
  41.         self.fromchild = os.fdopen(c2pread, 'r', bufsize)
  42.         if capturestderr:
  43.             os.close(errin)
  44.             self.childerr = os.fdopen(errout, 'r', bufsize)
  45.         else:
  46.             self.childerr = None
  47.         _active.append(self)
  48.  
  49.     
  50.     def _run_child(self, cmd):
  51.         if isinstance(cmd, basestring):
  52.             cmd = [
  53.                 '/bin/sh',
  54.                 '-c',
  55.                 cmd]
  56.         
  57.         for i in range(3, MAXFD):
  58.             
  59.             try:
  60.                 os.close(i)
  61.             continue
  62.             except OSError:
  63.                 continue
  64.             
  65.  
  66.         
  67.         
  68.         try:
  69.             os.execvp(cmd[0], cmd)
  70.         finally:
  71.             os._exit(1)
  72.  
  73.  
  74.     
  75.     def poll(self):
  76.         if self.sts < 0:
  77.             
  78.             try:
  79.                 (pid, sts) = os.waitpid(self.pid, os.WNOHANG)
  80.                 if pid == self.pid:
  81.                     self.sts = sts
  82.                     _active.remove(self)
  83.             except os.error:
  84.                 pass
  85.             except:
  86.                 None<EXCEPTION MATCH>os.error
  87.             
  88.  
  89.         None<EXCEPTION MATCH>os.error
  90.         return self.sts
  91.  
  92.     
  93.     def wait(self):
  94.         if self.sts < 0:
  95.             (pid, sts) = os.waitpid(self.pid, 0)
  96.             if pid == self.pid:
  97.                 self.sts = sts
  98.                 _active.remove(self)
  99.             
  100.         
  101.         return self.sts
  102.  
  103.  
  104.  
  105. class Popen4(Popen3):
  106.     childerr = None
  107.     
  108.     def __init__(self, cmd, bufsize = -1):
  109.         _cleanup()
  110.         (p2cread, p2cwrite) = os.pipe()
  111.         (c2pread, c2pwrite) = os.pipe()
  112.         self.pid = os.fork()
  113.         if self.pid == 0:
  114.             os.dup2(p2cread, 0)
  115.             os.dup2(c2pwrite, 1)
  116.             os.dup2(c2pwrite, 2)
  117.             self._run_child(cmd)
  118.         
  119.         os.close(p2cread)
  120.         self.tochild = os.fdopen(p2cwrite, 'w', bufsize)
  121.         os.close(c2pwrite)
  122.         self.fromchild = os.fdopen(c2pread, 'r', bufsize)
  123.         _active.append(self)
  124.  
  125.  
  126. if sys.platform[:3] == 'win' or sys.platform == 'os2emx':
  127.     del Popen3
  128.     del Popen4
  129.     
  130.     def popen2(cmd, bufsize = -1, mode = 't'):
  131.         (w, r) = os.popen2(cmd, mode, bufsize)
  132.         return (r, w)
  133.  
  134.     
  135.     def popen3(cmd, bufsize = -1, mode = 't'):
  136.         (w, r, e) = os.popen3(cmd, mode, bufsize)
  137.         return (r, w, e)
  138.  
  139.     
  140.     def popen4(cmd, bufsize = -1, mode = 't'):
  141.         (w, r) = os.popen4(cmd, mode, bufsize)
  142.         return (r, w)
  143.  
  144. else:
  145.     
  146.     def popen2(cmd, bufsize = -1, mode = 't'):
  147.         inst = Popen3(cmd, False, bufsize)
  148.         return (inst.fromchild, inst.tochild)
  149.  
  150.     
  151.     def popen3(cmd, bufsize = -1, mode = 't'):
  152.         inst = Popen3(cmd, True, bufsize)
  153.         return (inst.fromchild, inst.tochild, inst.childerr)
  154.  
  155.     
  156.     def popen4(cmd, bufsize = -1, mode = 't'):
  157.         inst = Popen4(cmd, bufsize)
  158.         return (inst.fromchild, inst.tochild)
  159.  
  160.     __all__.extend([
  161.         'Popen3',
  162.         'Popen4'])
  163.  
  164. def _test():
  165.     cmd = 'cat'
  166.     teststr = 'ab cd\n'
  167.     if os.name == 'nt':
  168.         cmd = 'more'
  169.     
  170.     expected = teststr.strip()
  171.     print 'testing popen2...'
  172.     (r, w) = popen2(cmd)
  173.     w.write(teststr)
  174.     w.close()
  175.     got = r.read()
  176.     if got.strip() != expected:
  177.         raise ValueError('wrote %s read %s' % (`teststr`, `got`))
  178.     
  179.     print 'testing popen3...'
  180.     
  181.     try:
  182.         (r, w, e) = popen3([
  183.             cmd])
  184.     except:
  185.         (r, w, e) = popen3(cmd)
  186.  
  187.     w.write(teststr)
  188.     w.close()
  189.     got = r.read()
  190.     if got.strip() != expected:
  191.         raise ValueError('wrote %s read %s' % (`teststr`, `got`))
  192.     
  193.     got = e.read()
  194.     if got:
  195.         raise ValueError('unexected %s on stderr' % `got`)
  196.     
  197.     for inst in _active[:]:
  198.         inst.wait()
  199.     
  200.     if _active:
  201.         raise ValueError('_active not empty')
  202.     
  203.     print 'All OK'
  204.  
  205. if __name__ == '__main__':
  206.     _test()
  207.  
  208.